package com.shihb.chapter03oop

import scala.beans.BeanProperty

object Demo01Start {
  def main(args: Array[String]): Unit ={
    val cat = new Cat1
    println(cat.color)
    // 这里cat.name= "小白"其实不是访问属性,而是name_$eq("小白")
    cat.name= "小白"   // cat.name_$eq("小白");
    cat.age =10       // cat.age_$eq(10);
    cat.color= "白色" // cat.color_$eq("白色");
    //这里cat.name等价于cat.name()
    println(cat.name,cat.age,cat.color)
    cat.setSomething("some")
    println(cat.getSomething)
    cat.something="some2"
    println(cat.something)
  }

}
// 定义一个猫类
// 一个class对应一个.class,默认public,如下
/*
  public class Cat
  {
    private String name = "";
    private int age;
    private String color;

    public String name()
    {
      return this.name; }
    public void name_$eq(String x$1) { this.name = x$1; }
    public int age() { return this.age; }
    public void age_$eq(int x$1) { this.age = x$1; }
    public String color() { return this.color; }
    public void color_$eq(String x$1) { this.color = x$1;
    }
  }
 */
class Cat1{
  // 声明三个属性
  // 说明
  // 1、当我们声明了 var name:String,在底层对应 private name
  // 2、同时会生成两个public方法
  // public name() 类似java getter
  // public name_$eq()类似java setter
  var name:String ="" //要给初始值,和java不同
  //_表示给默认初始值
  // boolean时false
  // 整形是0
  // 浮点型是0.0
  // string和引用时null
  var age:Int = _
  var color:String = _
  /**
   * 加了 @BeanProperty这个就是自动生成get,set方法
   * 可以理解为兼容java习惯，
   * 同时不影响scala特有的name(),name_$eq()
   * 两者同存
   */
  @BeanProperty
  var something:String = _

}
